////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//                                                                                                                            //
//                                                         WNProject                                                          //
//                                                                                                                            //
//            This file is distributed under the BSD 2-Clause open source license. See License.txt for details.               //
//                                                                                                                            //
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

#ifndef __WN_MATH_BASIC_MATH_H__
#define __WN_MATH_BASIC_MATH_H__

#include "WNCore/inc/WNTypes.h"

#define WN_E 2.71828182845904523536
#define WN_LOG2E 1.44269504088896340736
#define WN_LOG10E 0.434294481903251827651
#define WN_LN2 0.693147180559945309417
#define WN_LN10 2.30258509299404568402
#define WN_PI 3.14159265358979323846
#define WN_2PI 6.28318530717958647693
#define WN_PI_2 1.57079632679489661923
#define WN_PI_4 0.785398163397448309616
#define WN_1_PI 0.318309886183790671538
#define WN_2_PI 0.636619772367581343076
#define WN_SQRT2 1.41421356237309504880
#define WN_SQRT1_2 0.707106781186547524401
#define WN_2_SQRTPI 1.12837916709551257390

#define WN_TO_RADIAN(_degree) ((_degree) * (WN_PI / 180.0))
#define WN_TO_DEGREE(_radian) ((_radian) * (180.0 / WN_PI))

namespace WNMath {
    WN_FLOAT32 WNAbs(WN_FLOAT32 _x);
    WN_FLOAT32 WNMod(WN_FLOAT32 _x, WN_FLOAT32 _y);
    WN_FLOAT32 WNRound(WN_FLOAT32 _x);
    WN_FLOAT32 WNCeil(WN_FLOAT32 _x);
    WN_FLOAT32 WNFloor(WN_FLOAT32 _x);
    WN_FLOAT32 WNTrunc(WN_FLOAT32 _x);

    WN_FLOAT32 WNSqrt(WN_FLOAT32 _x);
    WN_FLOAT32 WNInvSqrt(WN_FLOAT32 _x);
    WN_FLOAT32 WNPow(WN_FLOAT32 _x, WN_FLOAT32 _y);

    WN_FLOAT32 WNSin(WN_FLOAT32 _x);
    WN_FLOAT32 WNCos(WN_FLOAT32 _x);
    WN_FLOAT32 WNTan(WN_FLOAT32 _x);
    WN_FLOAT32 WNASin(WN_FLOAT32 _x);
    WN_FLOAT32 WNACos(WN_FLOAT32 _x);
    WN_FLOAT32 WNATan(WN_FLOAT32 _x);
    WN_FLOAT32 WNATan2(WN_FLOAT32 _x, WN_FLOAT32 _y);

    WN_FLOAT32 WNExp(WN_FLOAT32 _x);
    WN_FLOAT32 WNExp2(WN_FLOAT32 _x);
    WN_FLOAT32 WNLn(WN_FLOAT32 _x);
    WN_FLOAT32 WNLog2(WN_FLOAT32 _x);
    WN_FLOAT32 WNLog10(WN_FLOAT32 _x);

    template<typename Type> const Type& WNMin(const Type& _first, const Type& _second);
    template<typename Type> const Type& WNMax(const Type& _first, const Type& _second);
}

#include "WNMath/inc/WNBasic.inl"

#endif // __WN_MATH_BASIC_MATH_H__